﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Biciq.Datos;

namespace Biciq.Logica
{
    public class SeguridadServicio
    {   
        public List<Acceso> getAccesos(Guid idRol)
        {
            List<Acceso> accesos = new List<Acceso>();

           using (BiciqContexto context = new BiciqContexto())
           {
               accesos = context.Accesoes.Where(a => a.idRol == idRol).ToList();
           }

           return accesos;
    
        }
        /// <summary>
        /// Metodo que muestra el roll
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="cultura"></param>
        /// <returns></returns>
        public List<Rol> consultarRol(string nombre, string cultura)
        {
            List<Rol> roles = new List<Rol>();

            using (BiciqContexto context = new BiciqContexto())
            {

                
                    roles = context.Rols.Where(r => r.nombre.Contains(nombre) && r.estado=="ACT").ToList();
               

            }
            return roles;
        }

        public List<Recurso> consultarRecursos()
        {
            List<Recurso> recursos = new List<Recurso>();

            using (BiciqContexto context = new BiciqContexto())
            {
                recursos = context.Recursoes.ToList();

            }
            return recursos;
        }
        /// <summary>
        /// Metodo que muestra el identificador unico del roll
        /// </summary>
        /// <param name="idRol">Indetificador</param>
        /// <returns></returns>
        public List<Recurso> consultarRecursos(Guid idRol)
        {
            List<Recurso> recursos = new List<Recurso>();

            using (BiciqContexto context = new BiciqContexto())
            {
                recursos = context.Accesoes.Where(a => a.idRol == idRol).Select(a => a.Recurso).ToList();
            }
            return recursos;
        }
        /// <summary>
        /// Metodo que muestra el nombre del roll
        /// </summary>
        /// <param name="nombre">nombre del roll</param>
        /// <returns></returns>
        public List<Usuario> consultarUsuario(string nombre)
        {
            List<Usuario> usuarios = new List<Usuario>();

            using (BiciqContexto context = new BiciqContexto())
            {


                usuarios = context.Usuarios.Where(u=>u.nombreUsuario.Contains(nombre) && u.estado == "ACT").ToList();
               

            }
            return usuarios;
        }
        /// <summary>
        /// Metodo que muestra el usuario del roll
        /// </summary>
        /// <param name="idUsuario">identificador del Empleado</param>
        /// <returns></returns>
        public Usuario consultarUsuario(Guid idUsuario)
        {
            Usuario usuario = new Usuario();
            using (BiciqContexto context = new BiciqContexto())
            {
                usuario = context.Usuarios.Where(u => u.id == idUsuario).FirstOrDefault();
            }
            return usuario;
        }
        /// <summary>
        /// Metodo que devuelve el roll a consultar
        /// </summary>
        /// <param name="idRol">Indetificador del roll</param>
        /// <returns></returns>
        public Rol consultarRol(Guid idRol)
        {
            Rol rol = new Rol();

            using (BiciqContexto context = new BiciqContexto())
            {
                
                rol = context.Rols
                    .Include("Usuarios")
                    .Where(r => r.id == idRol).FirstOrDefault();


            }
            return rol;
        }
        /// <summary>
        /// Metodo que devuelve el email del Empleado a consultar
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        public Usuario consultarUsuarioEmail(string email)
        {
            Usuario usuario = new Usuario();

            using (BiciqContexto context = new BiciqContexto())
            {

                usuario = context.Usuarios.Where(u => u.email.ToUpper() == email.ToUpper() && u.estado == "ACT").FirstOrDefault();



            }
            return usuario;
        }

        /// <summary>
        /// Metodo que permite el cambio de clave
        /// </summary>
        /// <param name="email">Email</param>
        /// <returns></returns>
        public Result cambiarClave(string email)
        {
            Result resultado = new Result();
            try
            {
                using (BiciqContexto context = new BiciqContexto())
                {

                    Usuario usuario = context.Usuarios.Where(u => u.email.ToUpper() == email.ToUpper() && u.estado == "ACT").FirstOrDefault();
                    if (usuario == null)
                    {
                        resultado.estado = false;
                        resultado.mensaje = "No existe un usuario con el email ingresado, confirme los datos e intente nuevamente";
                        return resultado;
                    }
                    string nuevaClave = usuario.nombreUsuario + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString();
                    usuario.clave = Comun.encript(nuevaClave);
                    usuario.primerIngreso=true;

                    var stateEntry = context.ObjectStateManager.GetObjectStateEntry(usuario);
                    foreach (var propertyName in stateEntry.CurrentValues
                                                 .DataRecordInfo.FieldMetadata
                                                 .Select(fm => fm.FieldType.Name))
                    {
                        stateEntry.SetModifiedProperty(propertyName);
                    }
                    context.SaveChanges();
                    context.Detach(usuario);

                    resultado.mensaje = nuevaClave;
                    resultado.estado = true;

                }
            }
            catch (Exception ex)
            {
                resultado.estado = false;
                resultado.mensaje = "Error al resetear Clave: " + ex.Message;
                
            }
            return resultado;

        }
        /// <summary>
        /// Metodo que valida el ingreso del empleado 
        /// </summary>
        /// <param name="usuario">Nick de empleado</param>
        /// <param name="clave">Contraseña</param>
        /// <returns></returns>
        public Result ValidarUsuario(string usuario, string clave)
        {
            return new Result();
        }
    }
    
      
}
